package keer.httpinterface.annotation;
import keer.httpinterface.HttpInterceptor;
import keer.httpinterface.http.ContentTypes;
import keer.httpinterface.http.HttpMethod;
import keer.httpinterface.http.HttpRequest;
import keer.httpinterface.utils.ConstantUtils;

import java.lang.annotation.*;

/**
 * 请求接口标注注解，用于作为其他具体请求方法类型注解的基础注解,
 * 为接口请求指定请求URL、请求头、请求参数、字符集等
 * @see Header
 * @see Param
 * @see HttpMethod
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
@Documented
public @interface Request {
   /**
    * 请求地址
    * @return
    */
   String url() default "";
   /**
    * 请求头
    * @return
    */
   Header[] headers() default {};

   /**
    * 请求参数
    * @return
    */
   Param[] params() default {};

   /**
    * 请求方法，见{@link HttpMethod}
    * @return
    */
   HttpMethod method();

   /**
    * 请求标记注解配置处理类
    * @return
    */
   Class<? extends AnnotationConfigure<HttpRequest>> configure();

   /**
    * 请求是否包含请求体
    * @return
    */
   boolean body() default false;

   /**
    * 如果包含请求体，请求体的类型（Content-Type请求头）,
    * 此属性可以通过{@link #headers()}中指定，也可以在此指定，此处指定后会覆盖
    * {@link #headers()}中配置的值
    * @return
    */
   String contentType() default ContentTypes.APPLICATION_JSON;

   /**
    * 如果包含请求体，请求体使用的字符集
    * @return
    */
   String charset() default ConstantUtils.DEFAULT_CHARSET;

   /**
    * 发起http请求前执行的拦截器
    * @see HttpInterceptor
    * @return
    */
   Class<? extends HttpInterceptor>[] interceptors() default {};
}
